import pandas as pd
import numpy as np
import datetime as datetime
import warnings
import openpyxl
from openpyxl import load_workbook
from decimal import Decimal as decimal

import xlrd
import xlwt

from datetime import datetime, timedelta
import calendar


# pandas读取需要的数据
def readDate():
    readHeard = ['工厂', '物料编码', '描述', '单位', '请购数量', '创建日期', '采购申请号', '行项目']
    数据表格['申请数量'] = 数据表格['申请数量'].str.replace(',', '').astype(float)
    数据表格['申请数量'] = 数据表格['申请数量'].round(3)
    数据表格['转单数量'] = 数据表格['转单数量'].str.replace(',', '').astype(float)
    数据表格['转单数量'] = 数据表格['转单数量'].round(3)
    数据表格['请购数量'] = 数据表格['申请数量'] - 数据表格['转单数量']
    数据表格['请购数量'] = 数据表格['请购数量'].round(3)
    # 读取需要保存的数据字段，并转换为列表，用于存储到excel中
    readDate = 数据表格[readHeard]
    readDateList = readDate.values.tolist()
    print(readDateList)


# 获取Excel中的料号和对应工厂
def readExcel():
    运行记录表路径 = '../文件/运行记录表202405091111.xlsx'
    readExcel = pd.read_excel(运行记录表路径, dtype=str)
    print(readExcel)
    numberList = readExcel['物料编号'].values.tolist()
    print(numberList)


# readExcel()


def readPriceDate():
    numberList = ['140038530', '130027623', '130027626', '140186600', '130023300', '130023298', '130023302',
                  '130023301', '130022804', '140147544', '130023301', '130022804', '140147544']
    表头 = ['信息记录类别', '采购信息记录号', '采购组', '采购组织', '工厂', '供应商', '供应商简称', '供应商全称',
            '物料编码', '物料描述', '采购信息记录长文本', '计量单位', '订货量从', '单价类型', '税码', '税率文本',
            '价格', '未税价', '原含税单价', '原未税单价', '价格单位', '未税调幅率', '含税调幅率', '核价单位', '币种',
            '采购提前期', '生效日期', '失效日期', '最后采购订单', '删除标记', '核价单号', '核价人员',
            '采购信息记录备注', '原核价日期', '原价格单位']
    批量采集结果 = [
        ['0.标准', '5300654529', '105', '1070', '1071', '6003645', '恒锋模具', '长沙市恒锋模具有限公司 ', '130027626',
         '云烟重九中支条盒面纸刀模24034816木板', '云烟重九中支条盒面纸刀模24034816/木板', '块 ', '0.000', '总价格 ',
         'J6', '13% 进项税，中国', '1,268.00', '1,122.12', '1,268.00', '1,122.12', '1', '0.00%', '0.00%', '块 ', 'CNY',
         '3', '2024.04.25', '2024.07.25', '', '', '1783421503824592896', '8008129-石珍', '', '2024.04.11', '1'],
        ['0.标准', '5300654530', '105', '1070', '1071', '6003645', '恒锋模具', '长沙市恒锋模具有限公司 ', '130027627',
         '云烟(重九中支)条盒面纸底模24034817树脂板 ', '云烟(重九中支)条盒面纸底模24034817/树脂板 ', '对 ', '0.000',
         '总价格 ', 'J6', '13% 进项税，中国', '90.00', '79.65', '90.00', '79.65', '1', '0.00%', '0.00%', '对 ', 'CNY',
         '6', '2024.04.25', '2024.07.25', '', '', '1783421503824592896', '8008129-石珍', '', '2024.04.11', '1'],
        ['0.标准', '5300528687', '105', '1070', '1072', '6000040', '长葛四纬机械', '长葛市四纬机械制造有限公司 ',
         '140186600', '挡盒边09-230913-02-001依图SUS304镜面', '挡盒边/09-230913-02-001依图/SUS304/镜面', '个 ', '0.000',
         '总价格 ', 'J6', '13% 进项税，中国', '96.00', '84.96', '96.00', '84.96', '1', '0.00%', '0.00%', '个 ', 'CNY',
         '10', '2024.03.26', '2024.06.26', '5400170179', '', '1772449677594198016', 'WH1251-王超', '', '2023.09.26',
         '1']]

    运行记录表路径 = '../文件/运行记录表202405091111.xlsx'
    readExcel = pd.read_excel(运行记录表路径, dtype=str)
    print(f'本次读取到运行记录表中共有{len(readExcel)}条数据')
    ExcelHead = readExcel.columns.tolist()
    warnings.filterwarnings('ignore')

    pd.set_option('display.max_columns', None)
    priceDate = pd.DataFrame(批量采集结果, columns=表头)
    heard = ['工厂', '供应商', '供应商全称', '物料编码', '价格', '生效日期']
    priceDate = priceDate[heard]
    priceDate['价格'] = priceDate['价格'].str.replace(',', '').astype(str)
    # print(priceDate)
    compareMap = {'工厂': 'first', '供应商': 'first', '供应商全称': 'first', '物料编码': 'first', '价格': 'first',
                  '生效日期': 'first'}
    # 1.筛选出同一物料编号同一工厂同一供应商,不同时间段的最新一条数据
    resultNumberSame = priceDate.groupby(['工厂', '供应商', '物料编码']).agg(compareMap).reset_index(drop=True)
    print('****************')
    print(resultNumberSame)
    # 2.筛选出同一物料编号同一工厂,不同供应商的数据,标出这条是重复数据
    filtered_df = resultNumberSame.groupby(['工厂', '物料编码']).filter(lambda x: len(x['供应商'].unique()) > 1)
    # print(filtered_df)
    resultDifferent = filtered_df.groupby(['工厂', '物料编码'])[['供应商', '供应商全称', '价格', '生效日期']].agg(
        lambda x: '; '.join(map(str, x))).reset_index()
    print(resultDifferent)
    resultDifferent['核对结果'] = '存在多个供应商,暂不执行!,失败!'
    # 3.剔除掉resultNumberSame中多工厂的数据
    if (len(resultDifferent) > 0):  # 为空的时候跳过
        merge_df = pd.merge(resultNumberSame, resultDifferent[['工厂', '物料编码']], how='left',
                            on=['工厂', '物料编码'],
                            indicator=True)
        mergeSamedate = merge_df[merge_df['_merge'].isin(['left_only'])]
    else:
        mergeSamedate = resultNumberSame
    mergeSamedate = mergeSamedate[heard]
    mergeSamedate['核对结果'] = '成功'
    print(mergeSamedate)
    ######### 与运行记录表中的数据进行合并##########

    # 1.先合并同一料号同一工厂,多供应商的数据
    concatDate = pd.concat([mergeSamedate, resultDifferent], axis=0)
    renamemap = {'物料编码': '物料编号'}
    concatDate.rename(columns=renamemap, inplace=True)
    print(concatDate)
    mergeExcelDate = pd.merge(readExcel, concatDate, how='left', on=['工厂', '物料编号'])
    heardCompanMap = {'供方代码': '供应商', '供方名称': '供应商全称', '单价': '价格', '采购生效日期': '生效日期',
                      '采购价格核对结果': '核对结果'}
    for key, value in heardCompanMap.items():
        mergeExcelDate[key] = mergeExcelDate[value]
    returnDate = mergeExcelDate[ExcelHead]

    returnDate['采购价格核对结果'].fillna('未找到对应采购价格信息!,失败!', inplace=True)
    returnDateList = returnDate.values.tolist()
    print(returnDateList)
    # 用openyxl写入Excel中对应sheet页的数据
    wb = openpyxl.load_workbook(运行记录表路径)
    sheet = wb['Sheet1']
    start_row = 2
    for item in returnDateList:
        for col in range(1, len(item) + 1):
            sheet.cell(row=start_row, column=col).value = item[col - 1]
        start_row += 1
    wb.save(运行记录表路径)


# readPriceDate()

# 读取数据进行下单
def readResuleDate():
    运行记录表路径 = '../文件/运行记录表202405111034.xlsx'
    warnings.filterwarnings('ignore')

    pd.set_option('display.max_columns', None)
    readExcel = pd.read_excel(运行记录表路径, dtype=str)
    print(readExcel)
    print(f'本次读取到运行记录表中共有{len(readExcel)}条数据')
    # 把读取的结果存成一个List，方便用于后面的数据结果写入
    # 表头 = readExcel.columns.tolist()
    # 运行记录数据 = readExcel.values.tolist()
    # print(表头)
    # print(运行记录数据)
    # 读取其中'采购价格核对结果'为成功的数据，并且创建状态不是为成功或者失败状态的
    successDate = readExcel[(readExcel['采购价格核对结果'].isin(['成功'])) & ~(readExcel['创建状态'].isin(['成功', '失败']))]
    # 将'供方代码','供方名称'提取出来并整理成列表
    proNumber = successDate[['供方代码', '供方名称']]
    proNumberDate = proNumber.groupby(['供方代码']).agg({'供方代码': 'first', '供方名称': 'first'}).reset_index(
        drop=True)
    proNumberDateList = proNumberDate.values.tolist()
    # 遍历列表中的数据,并整理成一个map:{'供方代码':[['采购申请号','行项目','供方名称']...]}的形式
    proNumberMap = {}
    for item in proNumberDateList:
        result = successDate[successDate['供方代码'].isin([item[0]])]
        resultDate = result[['工厂', '采购申请号', '行项目', '供方名称']]
        # print(resultDate.values.tolist())
        # 按照列'工厂'进行分组
        grouped = resultDate.groupby(['工厂'])
        # 输出每个组的统计信息
        proMap = {}
        for name, group in grouped:  # 同一工厂的数据进行存储为{工厂：[list1,list2...]}
            proMap.setdefault(name[0], group.values.tolist())  # 代码不同这里取Name[0] 但是在流程中因为版本不同需要取name
        proNumberMap.setdefault(item[0], proMap)
    print(f'整理后结果map为: {proNumberMap}')


# readResuleDate()


# 将运行结果写入到Excel中
def resultCreate():
    元素文本值 = '0A 采购订单 5400169247 已创建'
    nan = ''
    运行记录表路径 = '../文件/运行记录表202405111034.xlsx'
    子键值 = [['1072', '1600144289', '280', '郑州艺领机电设备有限公司'],
              ['1072', '1600144289', '290', '郑州艺领机电设备有限公司'],
              ['1072', '1600144289', '300', '郑州艺领机电设备有限公司']]
    inputDate = pd.read_excel(运行记录表路径, dtype=str)

    print(inputDate)

    if ('已创建' in 元素文本值):
        采购单号 = 元素文本值[元素文本值.index('采购订单 ', ) + 5:元素文本值.index(' 已创建')]
        创建状态 = '成功'
        结果记录 = 元素文本值
    else:
        采购单号 = ''
        创建状态 = '失败'
        结果记录 = 元素文本值
    value_map = {}
    dateLis = [采购单号, 创建状态, 结果记录]
    print(f'本次创建采购单号运行结果：{dateLis}')
    for item in 子键值:
        '''定义一个字典，其中键是A列和C列的组合（元组），值是对应的新值（这里是一个列表或元组，用于B列和D列）
                value_map = {
                    ('foo', 'x'): [100, 1000],  # 假设这是B列和D列的新值
                    ('bar', 'y'): [200, 2000],
                    # ... 其他可能的组合
                }'''
        tuples = (item[1], item[2])
        value_map.setdefault(tuples, dateLis)
    print(f'将数据汇总成对应的字典-元组类型后：{value_map}')
    # 遍历value_map字典，并使用.loc索引器来找到并更新 采购单号列和 创建状态列 详细运行结果记录列的值
    for (a_val, b_val), (new_c_val, new_d_val, new_e_val) in value_map.items():
        mask = (inputDate['采购申请号'] == a_val) & (inputDate['行项目'] == b_val)
        inputDate.loc[mask, ['采购单号', '创建状态','详细运行结果记录']] = [new_c_val, new_d_val,new_e_val]
    returnDateList=inputDate.values.tolist()
    # 用openyxl写入Excel中对应sheet页的数据
    wb = openpyxl.load_workbook(运行记录表路径)
    sheet = wb['Sheet1']
    start_row = 2
    for item in returnDateList:
        for col in range(1, len(item) + 1):
            sheet.cell(row=start_row, column=col).value = item[col - 1]
        start_row += 1
    wb.save(运行记录表路径)
    print(f'本次写入Excel完成！！！')
resultCreate()
